#include "asio_thread.h"
#include <iostream>
#include <chrono>

uint64_t posix_time_s()
{
    return std::chrono::time_point_cast<std::chrono::seconds>(std::chrono::system_clock::now()).time_since_epoch().count();
}

void perform_periodic_task()
{
    std::cout << "Thread Id: " << std::this_thread::get_id() << "  Performing periodic task..." << std::endl;
}

// 每次任务的间隔（任务执行 + 等待）
const auto TASK_INTERVAL = std::chrono::seconds(3); // 例如，每3秒执行一次

void start_periodic_loop(asio::steady_timer& timer)
{
    // 1. 执行任务（非阻塞）
    perform_periodic_task();
    // 2. 设置下一次执行的时间点
    timer.expires_after(TASK_INTERVAL);
    // 3. 异步等待下一次执行
    timer.async_wait([&timer](const asio::error_code& ec)
    {
        if (ec)
        {
            // operation_aborted 是 timer.cancel() 导致的正常退出
            if (ec != asio::error::operation_aborted) {
                std::cout << "Timer error: " << ec.message() << std::endl;
            }
            return;
        }

        // 当定时器到期，再次调用循环函数
        start_periodic_loop(timer);
    });
}

int main() {
    std::cout << "Main thread ID: " << std::this_thread::get_id() << std::endl;

    // 1. 创建 AsioThread 实例
    T_ASIO::AsioThread asio_worker;
    std::cout << "AsioThread state before start: " << static_cast<int>(asio_worker.get_state()) << " (Ready)\n";

    // 2. 启动线程，它将开始运行内部的 io_context
    asio_worker.start_thread("AsioWorkerThread");
    std::cout << "AsioThread state after start: " << static_cast<int>(asio_worker.get_state()) << " (Running)\n";
    std::cout << "AsioThread ID: " << asio_worker.get_id() << std::endl;

    // 3. 向 AsioThread 提交任务
    // 提交一个简单的任务
    std::atomic<int> counter = 0;

    asio_worker.post_task([&counter]() {
        std::cout << "[Task A] Executing on thread: " << std::this_thread::get_id() << std::endl;
        counter++;
    });

    // // 设置一个2秒后执行的任务
    // asio_worker.get_timer()->expires_after(std::chrono::seconds(2));
    // std::cout << "current time : " << posix_time_s() << std::endl;
    // asio_worker.get_timer()->async_wait([&counter](const asio::error_code& ec) {
    //     if (ec) return;
    //     std::cout << "[Task B] 2-second timer fired on thread: " << std::this_thread::get_id() << "current time : " << posix_time_s() << std::endl;
    //     counter++;
    // });

    // 周期性任务
    auto& timer = asio_worker.get_timer();
    timer.async_wait([&timer](const asio::error_code& ec)
    {
        if (!ec)
        {
            start_periodic_loop(timer);
        }
    });

    // 4. 主线程等待一段时间，让异步任务执行
    std::cout << "Main thread is sleeping for 6 seconds, letting tasks run...\n";
    std::this_thread::sleep_for(std::chrono::seconds(6));

    // 5. 停止并清理
    std::cout << "Main thread requests stop.\n";
    asio_worker.stop_thread(); // 这将取消所有待处理的异步操作（如定时器）并停止事件循环
    asio_worker.join(); // 等待线程完全退出

    std::cout << "AsioThread joined. Final counter value: " << counter.load() << std::endl;
    std::cout << "AsioThread state after join: " << static_cast<int>(asio_worker.get_state()) << " (Stopped)\n";

    return 0;
}